#include <iostream>
#include <cstdlib>
#include <ctime>
#include "threadPool.hpp"
#include "log.hpp"
#include "Task.hpp"
// 主线程获取任务，去push进线程池中
// 其他线程执行任务。
int main()
{

    srand((unsigned long)time(nullptr) ^ getpid());
    // 那么，如果单利本身也在被多线程申请使用呢?则需要考虑到线程安全，所以要加锁。

    // ThreadPool<Task> *tp=ThreadPool<Task>::getThreadPool(5);//由于不能构造，只能用指针
    // tp->run();
    ThreadPool<Task>::getThreadPool()->run(); // 由于线程的内部的static ThreadPool<T>指针是静态的，
                                              // 而且限定了指针不为nullptr直接返回，保证了只有一个线程指针，从而保证了是单例的线程。

    while (true)
    {
        int x = rand() % 100 + 1;
        usleep(4399);
        int y = rand() % 30 + 1;
        // 生产的过程，制作任务的时候，要花时间
        Task t(x, y, [](int x, int y) -> int
               { return x + y; });

        logMessage(DEBUG, "制作任务完成: %d+%d=?", x, y);
        logMessage(DEBUG, "制作任务完成: %d+%d=?", x, y);
        logMessage(DEBUG, "制作任务完成: %d+%d=?", x, y);
        logMessage(DEBUG, "制作任务完成: %d+%d=?", x, y);

        // 推送任务
        //  tp->pushTask(t);
        ThreadPool<Task>::getThreadPool()->pushTask(t);
    }
    return 0;
}